package com.zoe.onelink.core.util;

import com.zoe.onelink.core.async.OnelinkContextTaskDecorator;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * <p>标题: </p>
 * <p>描述: </p>
 * <p>版权: Copyright (c) 2023</p>
 * <p>公司: 智业软件股份有限公司</p>
 *
 * @version: 1.0
 * @author: ruansheng
 * @date: 2023-02-28
 */
public class OnelinkThreadUtil {

    /**
     * 创建线程池
     *
     * @param threadNamePrefix 线程名称前缀
     * @return Executor
     */
    public static Executor createThreadExecutor(String threadNamePrefix) {
        // 调用createThreadExecutor方法，传入默认的参数值
        return createThreadExecutor(threadNamePrefix, 10, 20, 1024);
    }

    /**
     * 创建线程池
     *
     * @param threadNamePrefix 线程名称前缀
     * @param corePoolSize     核心线程数
     * @param maxPoolSize      最大线程数
     * @param queueSize        队列大小
     * @return Executor
     */
    public static Executor createThreadExecutor(String threadNamePrefix,
                                                int corePoolSize,
                                                int maxPoolSize,
                                                int queueSize) {
        // 调用createThreadExecutor方法，传入自定义的拒绝策略
        return createThreadExecutor(threadNamePrefix, corePoolSize, maxPoolSize, queueSize, new ThreadPoolExecutor.AbortPolicy());
    }

    /**
     * 创建线程池
     *
     * @param threadNamePrefix         线程名称前缀
     * @param corePoolSize             核心线程数
     * @param maxPoolSize              最大线程数
     * @param queueSize                队列大小
     * @param rejectedExecutionHandler 拒绝策略
     *                                 ThreadPoolExecutor.AbortPolicy：
     *                                 直接抛出RejectedExecutionException异常，该异常通常由ThreadPoolExecutor的submit方法抛出。
     *                                 ThreadPoolExecutor.DiscardPolicy：
     *                                 直接丢弃任务，没有任何异常抛出，如果线程池容量已满，新提交的任务将被忽略。
     *                                 ThreadPoolExecutor.DiscardOldestPolicy：
     *                                 丢弃最老的一个请求，也就是即将被执行的任务，并尝试重新提交被拒绝的任务。
     *                                 ThreadPoolExecutor.CallerRunsPolicy：
     *                                 只要线程池未关闭，该策略直接在调用者线程中，运行当前被丢弃的任务，也就是在当前线程执行该任务。
     *                                 自定义拒绝策略：
     *                                 可以根据具体业务需求，自定义实现RejectedExecutionHandler接口，实现rejectedExecution方法来定义具体的拒绝策略。
     * @return Executor
     */
    public static Executor createThreadExecutor(String threadNamePrefix,
                                                int corePoolSize,
                                                int maxPoolSize,
                                                int queueSize,
                                                RejectedExecutionHandler rejectedExecutionHandler) {
        // 创建一个线程池
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 设置线程名称前缀
        executor.setThreadNamePrefix(threadNamePrefix);
        // 设置核心线程数
        executor.setCorePoolSize(corePoolSize);
        // 设置最大线程数
        executor.setMaxPoolSize(maxPoolSize);
        // 设置队列大小
        executor.setQueueCapacity(queueSize);
        // 设置拒绝策略
        executor.setRejectedExecutionHandler(rejectedExecutionHandler);
        // 设置任务装饰器
        executor.setTaskDecorator(OnelinkContextTaskDecorator.getInstance());
        // 初始化线程池
        executor.initialize();
        // 返回线程池
        return executor;
    }

}
